package threads;

import gui.Supervisor;

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.LinkedList;

import javax.swing.JLabel;


public class ThreadAtaqueTorres extends Thread
{
	private boolean[] hayEnemigos;
	private Map<Integer,JLabel>[] listaTorres;
	private Map<Integer,List<JLabel>> mapeoEnemigos;
	private Map<JLabel,JLabel> mapeoDisparos;
	private Supervisor sup;
	private boolean terminar;
	
	public ThreadAtaqueTorres(Supervisor s)
	{
		sup = s;
		listaTorres = new Map[5];
		mapeoEnemigos = new HashMap<Integer, List<JLabel>>();
		for(int i = 0; i < 5; i++)
		{
			mapeoEnemigos.put(i, new LinkedList<JLabel>());
			listaTorres[i] = new HashMap<Integer,JLabel>();
		}
		mapeoDisparos = new HashMap<JLabel,JLabel>();
		hayEnemigos = new boolean[5];
		terminar = false;
	}
	
	public void agregarTorre(JLabel torre, int fila, int columna)
	{
		
		listaTorres[fila].put(columna, torre);
	}
	
	public void agregarEnemigo(JLabel enemigo)
	{
		int y = sup.obtPosY(enemigo);
		mapeoEnemigos.get(y).add((JLabel)enemigo);
		hayEnemigos[y] = true;
	}
	
	public void run() 
	{
		while(!terminar)
		{
			try {
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			int fila = 0;
			while(fila < 5) //Recorro las filas de torres
			{
				if(!listaTorres[fila].isEmpty()) //Si hay torres en esa fila
				{
					JLabel primerTorre = null;
					if(hayEnemigos[fila]) //Si hay enemigos en esa fila
					{
						primerTorre = buscarPrimeraTorre(fila); //Busco la torre que esta mas cerca de los enemigos
						if(sup.alguienAdelante(primerTorre)) //si adelante de esa torre hay un enemigo						
							 sup.peleaTorre(primerTorre); //aviso al supervisor
						boolean fueDest = false;
						for(Integer i: listaTorres[fila].keySet())
						{
							sup.cambiarLabelTorreAtacando(listaTorres[fila].get(i));
							if(!fueDest)
							{
								if(sup.atacarEnemigo(listaTorres[fila].get(i), mapeoEnemigos.get(fila).get(0)))
								{
									fueDest = true;
									eliminarEnemigo(mapeoEnemigos.get(fila).get(0), fila);
								}
								else
								{
									JLabel dis = sup.crearDisparo(listaTorres[fila].get(i), fila, i, mapeoEnemigos.get(fila).get(0).getX());
									mapeoDisparos.put(listaTorres[fila].get(i), dis);
								}
							}	
						}
					}
				}
				fila++; //Aumento para seguir recorriendo
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			for(JLabel label : mapeoDisparos.keySet())
			{
				sup.cambiarLabelTorreQuieta(label);
				JLabel aux = mapeoDisparos.get(label);
				sup.quitarDisparo(aux);
				mapeoDisparos.remove(aux);
			}
		}
	}
	
	public JLabel buscarPrimeraTorre(int fila)
	{
		JLabel toR = null;
		int i = 0;
		for(Integer columna: listaTorres[fila].keySet())
		{
			if(i <= columna)
			{
				i = columna;
				toR = listaTorres[fila].get(columna);
			}
		}
		return toR;
	}
	
	public void terminar()
	{
		terminar = true;
	}
	
	public void eliminarTorre(int posX, int posY)
	{
		listaTorres[posY].remove(posX);
	}

	public void eliminarEnemigo(JLabel enemigo, int posY)
	{
		mapeoEnemigos.get(posY).remove(enemigo);
		if(mapeoEnemigos.get(posY).isEmpty())
			hayEnemigos[posY] = false;
	}

	public JLabel obtEnemigo(int posY)
	{
		return mapeoEnemigos.get(posY).get(0);
	}
}
